/**
  * Author: Mei
  * Date: 2020-11-22 15:18
  * Description: 
  *
  */
#include <iostream>
#include <thread>
/**
 * thread_local关键字修饰的变量具有线程周期(thread duration)，
       这些变量(或者说对象）在线程开始的时候被生成(allocated)，
       在线程结束的时候被销毁(deallocated)。
        并且每 一个线程都拥有一个独立的变量实例(Each thread has its own instance of the object)。
 *
 */

struct S
{
    S() {
        printf("S() called i=%d\n", i);
    }
    int i = 0;
};
/**
 * 如果把：S gs;加上thread_local关键字，
 * 执行结果：结构体S在每个线程中都生成了一个实例，可以看出实例的内存地址不相同。
 */
thread_local S gs;
//S gs;

void foo()
{
    gs.i += 1;
    printf("foo  %p, %d\n", &gs, gs.i);
}

void bar()
{
    gs.i += 2;
    printf("bar  %p, %d\n", &gs, gs.i);
}

int main()
{
    std::thread a(foo), b(bar);
    a.join();
    b.join();
}